package com.csy.feign;

import java.util.Enumeration;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;

/**
 * 对Feign的调用功能进行过滤增强
 * 
 * @author 吴樑
 * @date 2021年12月28日
 * @version 1.0
 */
@Slf4j
public class FeignRequestInterceptor implements RequestInterceptor {

	/**
	 * 在通过Feign调用其他微服务接口时, 可能需要传递一些内容或者增加一些内容, 这里进行增强
	 */
	@Override
	public void apply(RequestTemplate template) {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		
		if (requestAttributes != null) {
			// 获取请求对象
			HttpServletRequest request = requestAttributes.getRequest();
			
			// 获取原请求的头部内容 并copy到template -- 这部分内容只是示例, 我没有仔细验证过, 可去掉 TODO
			Enumeration<String> headerNames = request.getHeaderNames();
			while (headerNames.hasMoreElements()) {
				// 这里在实际的应用中应调整为只复制业务相关的头, 如token等 TODO
				String key = (String) headerNames.nextElement();
				// 跳过 content-length避免测试时出错, 实际的应用中只复制业务相关头信息可去掉此项
                if ("content-length".equals(key)){
                    continue;
                }
				String value = request.getHeader(key);
				log.info("> [FeignRequestInterceptor]查找到请求头 {}: {}", key, value);
				template.header(key, value);
			}
			
			// 获取请求参数内容 并copy到template -- 这部分内容只是示例, 我没有仔细验证过, 可去掉 TODO
			Map<String, String[]> parameterMap = request.getParameterMap();
			parameterMap.forEach((k, l) -> {
				log.info("> [FeignRequestInterceptor]查找到请求参数 {}: {}", k, l.toString());
				template.query(k, l);
			});
		}
	}

}
